package com.wei.czz.framework.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wei.czz.common.enums.CommonEnum;
import com.wei.czz.common.enums.admin.user.UserMessageEnum;
import com.wei.czz.common.dto.admin.UserMessageDto;
import com.wei.czz.common.exception.CzzException;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.utils.SecurityUtils;
import com.wei.czz.common.vo.admin.userMessage.UserMessageFormVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.wei.czz.framework.admin.dao.UserMessageDao;
import com.wei.czz.framework.admin.entity.UserMessageEntity;
import com.wei.czz.framework.admin.service.UserMessageService;

import java.util.Date;
import java.util.List;


/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-03-10 23:00:19
 * className: UserMessageServiceImpl 用户消息操作请求服务接口实现类
 * version: 1.0
 * description:
 */
@Service("userMessageService")
public class UserMessageServiceImpl extends ServiceImpl<UserMessageDao, UserMessageEntity> implements UserMessageService {

    private static final Logger log = LoggerFactory.getLogger(UserMessageServiceImpl.class);

    @Override
    public void saveUserMessage(Long getUserId, Long sendUserId, Integer sort, String title, String message) {
        Date date = new Date();
        UserMessageEntity userMessage = new UserMessageEntity();
        userMessage.setGetUserId(getUserId)
                .setSendUserId(sendUserId)
                .setSort(sort)
                .setReadFlag(UserMessageEnum.READ_NO.getValue())
                .setDeleteFlag(CommonEnum.ZERO.getValue())
                .setTitle(title)
                .setMessage(message)
                .setUpdateTime(date)
                .setCreateTime(date);
        // 操作数据库用户消息表，新增一条用户消息信息
        int count = baseMapper.insert(userMessage);
        log.info("用户消息保存完成。count={}", count);
    }

    @Override
    public boolean batchSaveUserMessage(List<UserMessageEntity> userMessageList) {
        // 批量保存数据
        boolean bool = this.saveBatch(userMessageList);
        log.info("批量保存用户消息完成。bool={}", bool);
        return bool;
    }

    @Override
    public Long getUnreadUserMessageCount() {

        // 获取正在查询自己未查看消息个数的用户id
        Long optUserId = SecurityUtils.getUserId();

        LambdaQueryWrapper<UserMessageEntity> userMessageLambdaWrapper = new LambdaQueryWrapper<>();
        // 匹配 接收用户id和查看标记（’未查看‘） 字段
        userMessageLambdaWrapper.eq(UserMessageEntity::getGetUserId, optUserId)
                .eq(UserMessageEntity::getReadFlag, UserMessageEnum.READ_NO.getValue());
        // 查看数据库用户消息表，统计用户未查看消息个数
        return this.count(userMessageLambdaWrapper);
    }

    @Override
    public PageDto<UserMessageDto> getUserMessageList(UserMessageFormVo userMessageFormVo) {
        // 获取正在查询自己消息列表的用户id
        Long optUserId = SecurityUtils.getUserId();
        // 设置查询的用户id
        userMessageFormVo.setUserId(optUserId);
        // mp分页对象
        Page<UserMessageDto> page = new Page<>(userMessageFormVo.getPage(), userMessageFormVo.getLimit());
        // 查询数据库用户消息表，分页查询用户消息列表
        baseMapper.getUserMessageList(page, userMessageFormVo);

        return new PageDto<>(page);
    }

    @Override
    public void userMessageRead(String messageId) {

        LambdaUpdateWrapper<UserMessageEntity> userMessageLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        // 更新 用户查看标记（`已看`）和更新时间 字段值
        userMessageLambdaUpdateWrapper.set(UserMessageEntity::getReadFlag, UserMessageEnum.READ_YES.getValue())
                .set(UserMessageEntity::getUpdateTime, new Date());
        // 匹配 消息主键 字段
        userMessageLambdaUpdateWrapper.eq(UserMessageEntity::getMessageId, messageId);
        // 操作数据库用户消息表，更新用户消息的查看标记
        int count = baseMapper.update(null, userMessageLambdaUpdateWrapper);
        if (count == 0) {
            throw new CzzException("更新用户消息的查看标记失败，请务必及时处理");
        }
    }

    @Override
    public void userMessageDelete(String messageId) {
        LambdaUpdateWrapper<UserMessageEntity> userMessageLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        // 更新 用户删除标记（`删除`）和更新时间 字段值
        userMessageLambdaUpdateWrapper.set(UserMessageEntity::getDeleteFlag, CommonEnum.ONE.getValue())
                .set(UserMessageEntity::getUpdateTime, new Date());
        // 匹配 消息主键 字段
        userMessageLambdaUpdateWrapper.eq(UserMessageEntity::getMessageId, messageId)
                .eq(UserMessageEntity::getDeleteFlag, CommonEnum.ZERO.getValue());
        // 操作数据库用户消息表，更新用户消息的删除标记
        int count = baseMapper.update(null, userMessageLambdaUpdateWrapper);
        if (count == 0) {
            throw new CzzException("更新用户消息的删除标记失败，请务必及时处理");
        }
    }
}